#review类和对象
# class student:
#     name=None
#     age=None
#     tel=None
#
# student1=student()#调用类对象
# student1.name="周杰伦"
# student1.age=30
# student1.tel="110"
#
# student1=student()#调用类对象
# student1.name="林俊杰"
# student1.age=31
# student1.tel="120"

# 👆代码中，为对象的属性赋值需要依次进行，略显繁琐
# 有没有更加高效的方式，能够一行代码就完成呢?
# 思考: student()
# 这个括号，能否像函数(方法)那样，通过传参的形式对属性赋值呢?
# 可以，需要使用❗构造方法 :  __init__()

#❗实现：
#在创建类对象（构造类）的时候，❗会自动执行
#在创建类对象（构造类）的时候，❗会传入参数自动传递给__init__方法使用。

# class student:
#     # name=None
#     # age=None-----这三个可写可不写
#     # tel=None
#     def __init__(self,name,age,tel):#通过构造方法接收参数
#         self.name=name
#         self.age=age
#         self.tel=tel
#         print('student类创建了一个对象')
# stu=student("周杰伦",30,"110")
# print(stu.name)
# print(stu.age)
# print(stu.tel)

#summary
# 1.构造方法的名称是:
# init ，注意init前后的2个下划线符号
# 2.构造方法的作用:
# 构建类对象的时候会❗自动运行❗。
# 构建类对象的传参会传递给❗构造方法❗，借此特性可以给❗成员变量赋值❗
# 3.注意事项:
# 构造方法❗不要忘记self❗关键字。
# 在方法内使用成员变量需要❗使用self❗

# 开学了有一批学生信息需要录入系统，请设计一个类，
# 记录学生的:姓名、年龄、地址，这3类信息
# 请实现:
# 通过for循环，配合input输入语句，并使用构造方法，完成学生信息的键盘录入。
# 输入完成后，使用print语句，完成信息的输出
# name="周杰伦"
# age=20
# address="台湾省"
# name=input("please input your name:")
# address=input("please input your address:")
# age=int(input("please input your age:"))
# class student():
#         def __init__(self,name,age,address,):
#             self.name=name
#             self.age=age
#             self.address=address
#         print("完成信息输入")
#
# stu=student(input("please input your name:"),
#             input("please input your address:"),
#             int(input("please input your age:")))
# print(type(stu))
#
# #
# # ❗正确答案👇
# class Student:
#     def __init__(self, name, age, address):
#         self.name = name# 在方法内使用成员变量需要❗使用self❗
#         self.age = age
#         self.address = address
#
#
# students = []
# for i in range(1):#这是一个Python的for循环语句，循环次数为1次
#     name = input("请输入学生的姓名：")
#     age = input("请输入学生的年龄：")
#     address = input("请输入学生的地址：")
#     student = Student(name, age, address)
#     students.append(student)
#
# for student in students:
#     print("姓名：", student.name)
#     print("年龄：", student.age)
#     print("地址：", student.address)




# class animal:
#     def __init__(self,name,sex,food):
#         self.name=name
#         self.sex=sex
#         self.food=food
# animals=[]
# for x in range(10):
#     name=input("请输入动物名称")
#     sex=input("请输入动物性别")
#     food=input("请输入动物喜欢的食物")
#     Ani=animal(name,sex,food)
#     animals.append(Ani)
# for Ani in animals:
#     print("名称:",Ani.name)
#     print("名称:",Ani.sex)
#     print("名称:",Ani.food)

# print(type(animals))
#----------------------------------------------------------------------
# ❗常见的几种内置方法（也叫魔法方法）-
# 上文学习的 init 构造方法，是Python类内置的方法之一
# 这些内置的类方法，各自有各自特殊的功能，这些内置方法我们称之为:魔术方法
#常见的魔法方法：
# 🐖：__init__构造方法
#     __str__字符串方法
#     __lt__小于，大于符号比较
#     __le__小于等于、大于等于符号比较
#     __eq__==符号比较

#     __str__字符串方法
# class student:#定义student类
#     def __init__(self,name,age):
#         self.name=name
#         self.age=age
#
# student = student("zjl", 30)
# print(student)
# print(str(student))
#
# # student=student("zjl",30)#获取student类对象
# # print(str(student))
# # print(student)
# # print(str(student))
# #当类对象需要被转换为字符串时，会输出如上结果（内存地址）
# #内存地址没有多大作用，可以通过__str__方法，控制类转换为字符串的行为
##🐖__str__法--控制类转换为字符串的行为
#👇在上面进行的修改
# class student:#定义student类
#     def __init__(self,name,age):
#         self.name=name
#         self.age=age
#
#     def __str__(self):❗通过__str__方法，控制类转换为字符串的行为
#         return f"student类对象，name={self.name},age={self.age}"
#
# student = student("zjl", 30)
# print(student)
# print(str(student))
# ##🐖__lt__法--小于符号比较法--可同时完成小于符号和大于符号两种比较
# class student:#定义student类
#     def __init__(self,name,age):
#         self.name=name
#         self.age=age
#     def __lt__(self,other):#❗方法名：__lt__ 传入参数：other，另一个类对象
#         return self.age<other.age#
# stu1=student("zjl",30)
# stu2=student("ljj",20)
# print(stu1<stu2)
# print(stu1>stu2)
# # 返回值：true或false
#
# ##🐖__le__法--小于等于比较符号法  可用于<=,>=两种比较运算符
# class student:
#     def __init__(self,name,age):
#         self.name=name
#         self.age=age
#
#         #__le__魔法方法
#     def __le__(self,other):
#         return self.age>=other.age
#
#       #__eq__魔法函数
#     def __eq__(self,other):
#         return self.age==other.age
#
# stu1 = student("zjl", 30)
# stu2 = student("ljj", 20)
# print(stu1==stu2)

# 功能
# __init__构造方法，可用于创建类对象的时候设置初始化行为
# __str__用于实现类对象转字符串的行为
# __lt__用于2个类对象进行小于或大于比较
#__le__用于2个类对象进行小于等于或大于等于比较
# __eq__用于2个类对象进行相等比较



#封装
# 面向对象编程，是许多编程语言都支持的一种编程思想。
# 简单理解是:基于模板(类)去创建实体(对象)，使用对象完成功能开发
# ❗❗面向对象包含3大主要特性:
#封装
#继承
#多态

# 定义私有成员的方式
#私有成员变量：变量名__开头（2个下划线）
#私有成员方法：方法名__开头（2个下划线）
#❗∵两个变量都是私有的，∴调用他们时会报错
#
# class Phone:
#     __current_voltage=None#定义成员变量-当前手机运行电压
#
#     def __keep_single_core(self):#定义成员方法
#         print("让CPU以单核模式运行")
#
# phone=Phone()
# # phone.__keep_single_core#调用报错👇
# ##AttributeError: 'Phone' object has no attribute '__keep_single_core'
#
# print(phone.__current_voltage)
# # AttributeError: 'Phone' object has no attribute '__current_voltage'
# #Phone这个类没有当前这个__current_voltage成员变量

class Phone:
    __current_voltage=9

    def __keep_single_core(self):
        print("CPU单核模式运行")

    def call_by_5g(self):#公开方法
        if self.__current_voltage>=1:
            print("5g通话已开启")
        else:
            self.__keep_single_core()
            print("电量不足，无法使用5g通话，并已设置为单核运行")

phone=Phone()
phone.call_by_5g()

